#ifndef _MY_HASH_H_
#define _MY_HASH_H_

#include "common.h"

typedef unsigned int hindex_t; 	
typedef unsigned int value_t;							

/*!\struct node
\param dad nodo padre
\param symbol simbolo contenuto
\value label assegnata al nodo
*/

typedef struct{
	hindex_t dad;		
	uint8_t	symbol;		
	value_t value;		
} node;


/*! \fn uint8_t* h_init(node* tab)
\brief Inizializza La Tabella Hash con i primi 256 elementi
\param node* tab puntatore alla tabella 
\return ritorna 1 se va tutto bene
*/
uint8_t h_init(node* tab);

/*! \fn hindex_t h_get_index(value_t dad,uint8_t symbol)
\brief Funzione hash che calcola l'indice a partire da i due parametri passati
\param value_t dad è l'indice del padre
\param uint8_t symbol è il valore ascii del simbolo
\return ritorna l'indice della tabella
*/
hindex_t h_get_index(value_t dad,uint8_t symbol);

/*! \fn hindex_t h_get(node* tab,value_t dad,uint8_t symbol)
\brief Cerca l'elemento all'interno della tabella e se non lo trova restituisce -1
\param node* tab puntatore alla tabella 
\param value_t dad è l'indice del padre cercato
\param value_t dad è il simbolo cercato
\return ritorna l'indice cercato o -1 se non lo trova
*/
hindex_t h_get(node* tab,value_t dad,uint8_t symbol);

/*! \fn uint8_t h_insert(node* tab,value_t dad,uint8_t symbol,value_t value)
\brief Inserisce all'interno della tabella. Restituisce sempre true.
\param node* tab puntatore alla tabella 
\param value_t dad è l'indice del padre
\param value_t dad è il simbolo
\return ritorna 1
*/
uint8_t h_insert(node* tab,value_t dad,uint8_t symbol,value_t value);


/*! \fn uint8_t h_flush(node* tab)
\brief Pulisce tutta la tabella e reinizzializza i 256 elementi
\param node* tab puntatore alla tabella 
\return ritorna 1
*/
uint8_t h_flush(node* tab);

/*! \fn void h_print(node* tab)
\brief Stampa tutta la hash table
\param node* tab puntatore alla tabella 
\return void
*/
void h_print(node* tab);

/*! \fn void h_print2(node* tab,value_t padre,uint8_t depth);
\brief Stampa l'albero in maniera ricorsiva. Molto poco ottimizzato
\param node* tab puntatore alla tabella
\param value_t padre da cui partire
\uint8_t depth per stampare visualizzando la profondità dell'albero. 
\return void
*/
void h_print2(node* tab,value_t padre,uint8_t depth);


#endif

